프로세스를 설명하기에 앞서 프로그램을 알고 넘어갑시다.
프로그램이란 저장 장치에는 저장되어 있지만 메모리를 할당 받지 않은 정적인 상태의 파일입니다.
프로그램은 아직 실행되지 않은 실행 파일이라고 생각하면 됩니다. 코드 상태입니다.
이 프로그램을 실행하게 되면 컴퓨터 메모리에 올라가게 되고 이 상태를 동적인 상태라고 합니다.
이를 프로세스라 합니다.
운영체제에 자원을 할당 받아 수행하는 작업 단위입니다.
프로세스는 위에서 살펴보았듯이 메모리에 올라와 실행되고 있는 프로그램의 인스턴스를 의미합니다.
위 내용을 요약해 프로세스의 특징을 정리해보면 다음과 같습니다.
마지막 부분을 보면 “프로세스는 최소 1개의 스레드로 구성”된다고 합니다. 여기서 알 수 있듯이 일단 프로세스가 스레드보다 큰 개념임을 알 수 있습니다.
아래는 쉽게 파악할 수 있는 그림입니다.
프로세스 내에서 실행되는 흐름의 단위를 말합니다.
프로그램을 구성하는 프로세스만으로 여러 역할을 수행하는 프로그램의 실행을 감당하기에 벅차게 되었습니다.
운영체제는 안전성을 위해서 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제한하여 이를 벗어나는 범위의 정보에 접근하면 오류가 발생합니다.
이로 인해 프로세스를 여러 개 만들어 프로그램을 구성하는 것은 불가능했고 프로세스와는 다른 개념의 작은 실행 단위가 필요했습니다.
이것이 바로 스레드입니다.
스레드는 다음과 같은 특징이 있습니다.
운영체제가 프로세스에 메모리를 할당하면 프로세스마다 각각의 Code, Data, Heap, Stack 영역을 가지게 됩니다.
프로세스는 각각의 독립된 영역을 가지기 때문에 다른 프로세스의 변수나 자료에 접근할 수 없습니다.
위에서 본 스레드의 특징에서 스레드는 자원을 공유한다고 했습니다.
스레드는 프로세스 내에서 메모리의 Stack 영역만 할당받고, Code, Heap, Data 영역은 공유합니다.
위처럼 스레드는 동일 프로세스 내의 다른 스레드와 메모리를 공유하며, 프로세스는 다른 프로세스와 공유되지 않는 독립적인 메모리 공간을 갖습니다.
여기서 알 수 있는 점이 있습니다.
스레드는 CPU 입장에서의 최소 작업 단위입니다. 반면 운영체제의 입장에서는, 스레드 단위의 작업을 직접 하지 않기 때문에 프로세스가 최소 작업 단위가 됩니다.
따라서 메모리를 할당하는 운영체제의 입장에선 프로세스에 독립적인 메모리를 할당하게 되지만 프로세스는 여러 스레드로 구성되기 때문에 프로세스 내의 스레드는 메모리를 공유해야 하는 것입니다.
하나의 프로세스에서 여러 개의 스레드를 사용하여 여러 작업을 동시에 처리하는 것을 의미합니다.
다수의 프로세서가 협력적으로 하나 이상의 작업을 동시에 처리하는 것입니다. 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용합니다.
fork를 통해 자식 프로세스 생성 (UNIX)
멀티 프로세스의 경우 위에서 말했던 안정성의 장점이 있습니다.
즉, 멀티 프로세스의 경우엔 자원을 공유하지 않아도 될 경우에 적절하고 멀티 스레드의 경우엔 여러 기능과 메모리를 공유할 경우에 적절합니다.
위에서 프로세스 간의 통신에 대해 몇 번 언급이 있었습니다.
프로세스간 통신의 경우 CPU 레지스터 교체와 RAM과 CPU 사이의 캐시 메모리 초기화 등 자원 부담이 큽니다.
다음 방법으로 통신할 수 있습니다.
프로세스의 경우 자체의 생성/삭제에도 비용이 비교적 큰 편이며 프로세스 간 통신에도 부담이 큰 편입니다. 하지만 멀티 스레드의 경우 동기화 문제에 대응하기 위한 프로그래머의 별도의 노력이 필요합니다.
참조
감사합니다.
Photographs by Chaelin, Unsplash.